package com.android.util;

import java.util.ArrayList;
import java.util.StringTokenizer;

public class UtilImpressora {

	public static ArrayList<String> quebrarLinha(String texto,  int qtdCaracteresLinha, boolean justificar) {
		ArrayList<String> resultado = new ArrayList<String>();
		
		String linha = "";
		StringTokenizer st = new StringTokenizer(texto," ");
		while (st.hasMoreElements()) {
			String object = (String) st.nextElement().toString().trim();
	
			String textoTemp = null;
			if (!"".equals(linha)) {
				textoTemp = linha + " " + object;	
			} else {
				textoTemp = object;
			}
			
			if (textoTemp.length() - getTamanhoParaDespresar(textoTemp) >= qtdCaracteresLinha ) {
				
				resultado.add(justificar(linha, justificar,qtdCaracteresLinha));
				linha = "";
			}
			if (!"".equals(linha)) { 
				linha = linha + " ";
			}
			linha = linha + object;
		}
		if (!"".equals(linha)) { 
			resultado.add(justificar(linha, justificar,qtdCaracteresLinha));
		}
		return resultado;
	}
	
	public static int getTamanhoParaDespresar(String texto){

		int quantidadeDespresada = 0;
		boolean despresar = false;
		for (int i = 0; i < texto.length(); i++) {
			char cara = texto.charAt(i);
			if (cara == '{') {
				despresar = true;
			} 
			
			if (despresar) {
				quantidadeDespresada++;
			}
			
			if (cara == '}') {
				despresar = false;
			}  

		}
		
		return quantidadeDespresada;
	}
	
	public static String justificar(String texto, boolean justificar, int tamanho) {
		String textoJustificado = texto;
		
		int tamanhoDespresado = getTamanhoParaDespresar(textoJustificado);
		
		if (textoJustificado.length() - tamanhoDespresado < tamanho) {
			int quantidadeEspacoParaIncluir = tamanho - textoJustificado.length() + tamanhoDespresado;
			StringTokenizer st = new StringTokenizer(textoJustificado," ");
			int quantidadeEspacoExistente = st.countTokens()-1;
			if (quantidadeEspacoExistente == 0) {
				String reposicao = "";
				int quantidadeReposicao = tamanho - texto.length();
				while(quantidadeReposicao != 0){
					reposicao = reposicao + " ";
					quantidadeReposicao--;
				}

				return texto + reposicao;
			}
			int quantidadeEspacoMedio = (int)quantidadeEspacoParaIncluir / quantidadeEspacoExistente;
			if (quantidadeEspacoExistente == 1 || quantidadeEspacoMedio < 1) {
				String reposicao = "";
				while(quantidadeEspacoParaIncluir != 0){
					reposicao = reposicao + " ";
					quantidadeEspacoParaIncluir--;
				}
				int posicao = textoJustificado.indexOf(" ");
				if ( posicao != -1){
					textoJustificado = textoJustificado.substring(0, posicao) + reposicao + textoJustificado.substring(posicao , textoJustificado.length());  
					
				}
			} else {
				textoJustificado = "";
				String reposicao = "";
				while(quantidadeEspacoMedio != 0){
					reposicao = reposicao + " ";
					quantidadeEspacoMedio--;
				}

				String reposicaoPrimerio = "";
				int reposicaoPrimeiro = quantidadeEspacoParaIncluir - reposicao.length() * quantidadeEspacoExistente;
				while(reposicaoPrimeiro > 0){
					reposicaoPrimerio = reposicaoPrimerio + " ";
					reposicaoPrimeiro--;
				}

				boolean primeiro = true;
				while (st.hasMoreElements()) {
					String object = (String) st.nextElement();
					if (primeiro) {
						textoJustificado = textoJustificado + object + reposicaoPrimerio + reposicao + " ";
					} else {
						textoJustificado = textoJustificado + object + reposicao + " ";
					}
					primeiro = false;
				}
			}
		}
		return textoJustificado.trim();
	}		
}
